select()
, poll()
, এবং epoll()
এর মধ্যে পার্থক্যselect()
, poll()
, এবং epoll()
হল সিস্টেম কল যা একাধিক সকার বা ফাইল ডিসক্রিপ্টর পর্যবেক্ষণ করতে ব্যবহৃত হয়। এগুলি সাধারণত I/O মাল্টিপ্লেক্সিং এর জন্য ব্যবহৃত হয়, যেখানে একটি প্রোগ্রাম একাধিক সকেট বা ফাইল ডিসক্রিপ্টরের জন্য অপেক্ষা করতে পারে এবং জানিয়ে দিতে পারে কোন ডিসক্রিপ্টরগুলি পড়তে বা লেখতে প্রস্তুত। তবে, এগুলোর কার্যকারিতা, সীমাবদ্ধতা এবং দক্ষতায় পার্থক্য রয়েছে।
নিচে এই তিনটি ফাংশনের মধ্যে পার্থক্যগুলো বিস্তারিতভাবে আলোচনা করা হলো।
select()
select()
একটি পুরনো এবং সহজ পদ্ধতি যা একাধিক ফাইল ডিসক্রিপ্টর পর্যবেক্ষণ করতে ব্যবহৃত হয়। এটি সর্বপ্রথম Unix সিস্টেমে প্রবর্তিত হয়েছিল এবং এখনো অনেক সিস্টেমে ব্যবহৃত হয়।
select()
কিছু সীমাবদ্ধতা রাখে, যেমন এটি পর্যবেক্ষণ করা ফাইল ডিসক্রিপ্টরের সংখ্যা 1024 (বা কিছু সিস্টেমে আরও কম) এর মধ্যে সীমাবদ্ধ করতে পারে।select()
যখন একাধিক ফাইল ডিসক্রিপ্টর চেক করে, তখন এটি ব্লক হয়ে যেতে পারে (অথবা নন-ব্লকিং মোডে কাজ করতে পারে), এবং যতক্ষণ না কোনো ডিসক্রিপ্টর প্রস্তুত হয়, তখন এটি কোনো কাজ করে না।select()
একটি ফাইল ডিসক্রিপ্টরের মধ্যে কোন একটি প্রস্তুত অবস্থায় থাকা চিহ্নিত করতে সক্ষম। এটি পড়ার জন্য বা লেখার জন্য প্রস্তুত ডিসক্রিপ্টরগুলির একটি সেট প্রদান করে।fd_set readfds;
struct timeval timeout;
int retval;
FD_ZERO(&readfds);
FD_SET(fd, &readfds);
timeout.tv_sec = 5;
timeout.tv_usec = 0;
retval = select(fd+1, &readfds, NULL, NULL, &timeout);
if (retval == -1) {
perror("select()");
} else if (retval) {
printf("Data is available\n");
} else {
printf("No data within 5 seconds\n");
}
poll()
poll()
হল select()
এর একটি আধুনিক সংস্করণ, যা কিছু সীমাবদ্ধতা সমাধান করে। poll()
বেশি ফাইল ডিসক্রিপ্টর পরীক্ষা করতে সক্ষম এবং এটি ফাইল ডিসক্রিপ্টরগুলির একটি লম্বা অ্যারে গ্রহণ করে। poll()
ব্যবহারের ফলে select()
এর তুলনায় আরো বেশি নমনীয়তা পাওয়া যায়।
poll()
কোনও নির্দিষ্ট সংখ্যক ফাইল ডিসক্রিপ্টর সীমাবদ্ধতা রাখে না (সেটি সিস্টেম নির্ভর হতে পারে)।poll()
ও ব্লকিং মোডে থাকতে পারে। এটি ব্যবহৃত ফাইল ডিসক্রিপ্টরগুলির মধ্যে কোনটি প্রস্তুত আছে তা নির্ধারণ করে।poll()
প্রতিটি ফাইল ডিসক্রিপ্টরের জন্য একটি pollfd
কাঠামো ব্যবহার করে, যাতে সেগুলির অবস্থা চেক করা যায়।struct pollfd fds[1];
int timeout = 5000; // 5 সেকেন্ড
fds[0].fd = fd;
fds[0].events = POLLIN;
int ret = poll(fds, 1, timeout);
if (ret == -1) {
perror("poll()");
} else if (ret) {
printf("Data is ready\n");
} else {
printf("No data within 5 seconds\n");
}
poll()
এখনও কার্যকরী নয় কারণ এটি প্রত্যেকটি ফাইল ডিসক্রিপ্টরের অবস্থা চেক করতে একটি লুপ চালাতে হয়, যা বড় আকারের অ্যারে হলে ব্যয়বহুল হয়ে যায়।epoll()
epoll()
হল একটি উন্নত এবং অত্যন্ত দক্ষ পদ্ধতি যা Linux-এ তৈরি করা হয়েছে এবং এটি বিশেষভাবে অনেক ফাইল ডিসক্রিপ্টর ম্যানেজ করার জন্য ডিজাইন করা। এটি select()
এবং poll()
থেকে অনেক দ্রুত এবং স্কেলেবল।
epoll()
কোন ফাইল ডিসক্রিপ্টর সংখ্যা সীমাবদ্ধতা রাখে না এবং এটি বড় সংখ্যক সকেট বা ফাইল ডিসক্রিপ্টরগুলির জন্য উচ্চ দক্ষতা প্রদান করে।epoll()
শুধুমাত্র প্রস্তুত থাকা ফাইল ডিসক্রিপ্টরগুলির জন্য ট্র্যাকিং করে, এবং তাই এটি অপারেশন করতে কম সময় নেয়। এর মাধ্যমে কার্যকরী সময় এবং মেমরি ব্যবহারের অপটিমাইজেশন হয়।epoll()
"এভেন্ট-ভিত্তিক" পদ্ধতি ব্যবহার করে, যেখানে সিস্টেমটি কেবলমাত্র যখন কোনো ডিসক্রিপ্টর প্রস্তুত থাকে তখনই সিগন্যাল পাঠায়।#include <sys/epoll.h>
int epoll_fd = epoll_create1(0);
struct epoll_event ev;
ev.events = EPOLLIN; // Input event (for reading)
ev.data.fd = fd;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev);
struct epoll_event events[10];
int nfds = epoll_wait(epoll_fd, events, 10, 5000); // 5 seconds timeout
if (nfds == -1) {
perror("epoll_wait()");
}
epoll()
অনেক বড় সংখ্যক সকেট বা ফাইল ডিসক্রিপ্টর পরিচালনা করতে সক্ষম এবং এটি খুব দ্রুত কাজ করে। এতে কার্যকরী সময় কমে আসে, বিশেষত বড় সিস্টেমে যেখানে অনেক সকেট থাকতে পারে।epoll()
শুধুমাত্র প্রস্তুত ডিসক্রিপ্টরগুলির সঙ্গেই কাজ করে, যার ফলে অকার্যকরী ডিসক্রিপ্টরের জন্য লুপ চালানোর প্রয়োজন নেই।বৈশিষ্ট্য | select() | poll() | epoll() |
---|---|---|---|
সীমাবদ্ধতা | 1024 ফাইল ডিসক্রিপ্টর (বা সিস্টেম নির্ভর) | কোনো নির্দিষ্ট সীমাবদ্ধতা নেই | অসীম ফাইল ডিসক্রিপ্টর সংখ্যা |
পারফরম্যান্স | বড় সংখ্যক ডিসক্রিপ্টরের জন্য কম কার্যকর | select() এর চেয়ে উন্নত, তবে বড় ডিসক্রিপ্টরের জন্য যথেষ্ট নয় | বড় ডিসক্রিপ্টর সংখ্যা এবং স্কেলেবিলিটি |
অপারেশন | প্রত্যেক ডিসক্রিপ্টরের জন্য একযোগে চেক | প্রতিটি ফাইল ডিসক্রিপ্টরের অবস্থা চেক | কেবলমাত্র প্রস্তুত ডিসক্রিপ্টরের সাথেই কাজ |
এভেন্ট ভিত্তিক | নয় | নয় | হ্যাঁ |
ব্লকিং/নন-ব্লকিং | ব্লকিং অথবা নন-ব্লকিং | ব্লকিং অথবা নন-ব্লকিং | ব্লকিং অথবা নন-ব্লকিং |
select()
হল একটি পুরনো এবং সীমাবদ্ধ পদ্ধতি, যেটি ছোট আকারের অ্যাপ্লিকেশন বা কম সংখ্যক ডিসক্রিপ্টরের জন্য উপযুক্ত।poll()
কিছুটা উন্নত, তবে এটি এখনও কার্যকরী নয় বড় আকারের সিস্টেমের জন্য।epoll()
হল সবচেয়ে দক্ষ এবং উচ্চ পারফরম্যান্সের পদ্ধতি, যা বড় সংখ্যক ডিসক্রিপ্টর পরিচালনা করতে সক্ষম এবং এটি লিনাক্সে ব্যবহৃত হয়।তবে, যদি আপনার অ্যাপ্লিকেশনটি বড় আকারের বা অনেক সকেট/ফাইল ডিসক্রিপ্টর ব্যবহার করে, তবে epoll()
হল সর্বোত্তম পছন্দ।
common.read_more